Python实现指定区域桌面变化监控并报警

您所在的位置:网站首页 python 监控屏幕 Python实现指定区域桌面变化监控并报警

Python实现指定区域桌面变化监控并报警

2024-04-18 22:57| 来源: 网络整理| 查看: 265

在这篇博客中,我们将使用Python编程语言和一些常用的库来实现一个简单的区域监控和变化报警系统。我们将使用Tkinter库创建一个图形界面,允许用户选择监控区域,并使用OpenCV库进行图像处理和相似性比较,以检测区域内的变化,并通过播放声音进行报警。

https://www.zhihu.com/video/1674061414229745665实现效果

运行程序后可以看到一个菜单界面

在这里插入图片描述

点击开始识别按钮后可以选择你想要监控的区域

在这里插入图片描述

如图所示红色部分是点击开始按钮后拖动鼠标会显示的选择范围框,选择好区域后就开始识别该区域前后5秒内的变化。 程序还可以切换模式,可以监控摄像头画面的视频是否有变化,有变化也会报警。 程序运行后

在这里插入图片描述

准备工作

在开始之前,确保你已经安装了Python以及以下所需的库: tkinter: 用于创建图形界面 numpy: 用于处理图像数据 cv2 (OpenCV): 用于图像处理和相似性比较 pyautogui: 用于截取屏幕图像 pygame: 用于播放声音 PIL (Python Imaging Library): 用于图像处理

你可以使用pip命令来安装这些库:

pip install tkinter numpy opencv-python pyautogui pygame pillow选择监控区域

首先,让我们创建一个函数来选择监控区域。我们使用Tkinter库创建一个全屏的图形窗口,让用户通过鼠标点击和拖拽来选择监控区域。我们将保存选定的区域的坐标以供后续使用。

import tkinter as tk from PIL import Image, ImageTk start_x, start_y, end_x, end_y = None, None, None, None def select_screen_region(): global start_x, start_y, end_x, end_y def on_press(event): global start_x, start_y start_x, start_y = event.x, event.y def on_move(event): global end_x, end_y end_x, end_y = event.x, event.y canvas.coords(rect, start_x, start_y, end_x, end_y) def on_release(event): global end_x, end_y end_x, end_y = event.x, event.y canvas.coords(rect, start_x, start_y, end_x, end_y) root = tk.Tk() root.title("选择监控区域") root.attributes('-fullscreen', True) screenshot = pyautogui.screenshot() screenshot.save('desktop_screenshot.png', format='png') canvas = tk.Canvas(root, bg='white') canvas.pack(fill=tk.BOTH, expand=True) desktop_image = ImageTk.PhotoImage(file='desktop_screenshot.png') canvas.create_image(0, 0, anchor=tk.NW, image=desktop_image) rect = canvas.create_rectangle(0, 0, 0, 0, outline='red') canvas.bind("", on_press) canvas.bind("", on_move) canvas.bind("", on_release) root.mainloop()

调用select_screen_region()函数后,会弹出一个全屏的窗口,你可以通过鼠标点击和拖拽来选择监控区域。选定区域后,关闭窗口即可。

监控区域变化

接下来,我们将创建一个函数来监控选定区域内的变化。我们将使用OpenCV库对图像进行处理,并使用相似性比较来检测区域内的变化。如果检测到较大的变化,我们将播放声音进行报警。

import cv2 import numpy as np import threading # 初始化pygame库 pygame.init() pygame.mixer.init() # 全局变量,加载MP3文件 def load_alarm_sound(file_path): try: pygame.mixer.music.load(file_path) except pygame.error: print(f"无法加载音频文件:{file_path}") # 封装一个播放MP3警报的函数 def play_alarm(): try: # 播放MP3文件 pygame.mixer.music.play() except pygame.error: print("播放警报音频失败") # 调用load_alarm_sound函数,加载警报音频 load_alarm_sound("警报声.mp3") should_exit = False is_alarm = False prev_frame_image, current_frame_image = None, None def monitor(data_source): global should_exit, is_alarm, prev_frame_image, current_frame_image if data_source == "screenshot": prev_frame = capture_screen() elif data_source == "camera": cap = cv2.VideoCapture(0) prev_frame = capture_video_frame(cap) while not should_exit: current_frame = None if data_source == "screenshot": current_frame = capture_screen() elif data_source == "camera": current_frame = capture_video_frame(cap) if current_frame is not None: prev_gray = cv2.cvtColor(prev_frame, cv2.COLOR_BGR2GRAY) current_gray = cv2.cvtColor(current_frame, cv2.COLOR_BGR2GRAY) similarity = ssim(prev_gray, current_gray) threshold = 0.95 if similarity


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3